import { Body, Controller, Get, Inject, Logger, Post, UploadedFile, UseFilters, UseGuards, UseInterceptors, Version, VERSION_NEUTRAL } from '@nestjs/common';
import { AppService } from './app.service';
import { Custom } from './custom.decorator';
import { AaaGuard } from './aaa.guard';
import { Pro } from './pro.decorator';
import { AaaDto } from './add.dto';
import { HelloFilter } from './hello.filter';
import { FileInterceptor } from '@nestjs/platform-express';
import { WINSTON_LOGGER_TOKEN } from './winston/winston.module';
import { ConfigService } from '@nestjs/config';

@Controller({
    // version:'1' // 开启后 默认都是版本1  但是如果请求头不携带 version  那么会报错
    version: VERSION_NEUTRAL // 通用版本  请求头不携带version 也不会报错
    
})
@UseFilters(HelloFilter)
export class AppController {
    constructor(private readonly appService: AppService) { }

    // 不引用动态日志模块 需要每次new
    // private logger = new Logger()

    // 引入后 不需要每次new
    @Inject(WINSTON_LOGGER_TOKEN) // 注入 动态组件
    private logger;

    // 引入 config
    @Inject(ConfigService)
    private configService: ConfigService;

    @Get('/config')
    getConfig() {
        return {
            // env 文件
            aaa: this.configService.get('aaa'),
            bbb: this.configService.get('bbb'),

            // config文件
            config: this.configService.get('db')

        }
    }

    @Get()
    // 使用自定义装饰器
    @Custom('admin')
    @UseGuards(AaaGuard)
    getHello(): string {
        this.logger.log('hello 测试日志' , AppController.name )
        return this.appService.getHello();
    }

    // 因为Nest从上到下匹配，新版本放到最上面
    @Version('2')
    @Get('/test')
    test2():string {
        return 'version2'
    }
    
    @Get('/test')
    test():string {
        return 'version1'
    }

    
    // 使用自定义装饰器  组合版  组合了 @Get  @Custom  @UseGuards
    // 本质上就是内置装饰器不够用的时候，或者想把多个装饰器合并成一个的时候，都可以自定义装饰器。
    @Pro('hello' , 'admin2')
    getPro(): string {
        return this.appService.getHello();
    }

    // 测试自定义过滤器
    @Post('aaa') 
    aaa(@Body() aaaDto: AaaDto ){
        return 'success';
    }

    
    @Post('/upload')
    @UseInterceptors(FileInterceptor('file', {
        dest:'uploads'
    }))
    uploadFile(@UploadedFile() file :Express.Multer.File , @Body() body:any){
        console.log("body",body);
        console.log("file",file);
    }
}
